/**
 * PANDA 3D SOFTWARE
 * Copyright (c) Carnegie Mellon University.  All rights reserved.
 *
 * All use of this software is subject to the terms of the revised BSD
 * license.  You should have received a copy of this license along
 * with this source code in a file named "LICENSE."
 *
 * @file qtessSurface.I
 * @author drose
 * @date 2003-10-13
 */

/**
 *
 */
INLINE const std::string &QtessSurface::
get_name() const {
  return _egg_surface->get_name();
}

/**
 * Returns true if the defined surface is valid, false otherwise.
 */
INLINE bool QtessSurface::
is_valid() const {
  return (_nurbs != nullptr);
}

/**
 * Sets the importance of the surface, as a ratio in proportion to the square
 * of its size.
 */
INLINE void QtessSurface::
set_importance(double importance2) {
  _importance = sqrt(importance2);
  _importance2 = importance2;
}

/**
 * Indicates the surface to which this surface must match in its U direction.
 * If u_to_u is true, it matches to the other surface's U direction;
 * otherwise, it matches to the other surface's V direction.
 *
 * Note that the surface pointer is an indirect pointer.  The value passed in
 * is the address of the pointer to the actual surface (which may or may not
 * be filled in yet).  The actual pointer may be filled in later.
 */
INLINE void QtessSurface::
set_match_u(QtessSurface **match_u, bool match_u_to_u) {
  _match_u = match_u;
  _match_u_to_u = match_u_to_u;
}

/**
 * Indicates the surface to which this surface must match in its V direction.
 * If v_to_v is true, it matches to the other surface's V direction;
 * otherwise, it matches to the other surface's U direction.
 *
 * Note that the surface pointer is an indirect pointer.  The value passed in
 * is the address of the pointer to the actual surface (which may or may not
 * be filled in yet).  The actual pointer may be filled in later.
 */
INLINE void QtessSurface::
set_match_v(QtessSurface **match_v, bool match_v_to_v) {
  _match_v = match_v;
  _match_v_to_v = match_v_to_v;
}

/**
 * Specifies the absolute minimum number of segments allowed in the U
 * direction.
 */
INLINE void QtessSurface::
set_min_u(int min_u) {
  _min_u = min_u;
}

/**
 * Specifies the absolute minimum number of segments allowed in the V
 * direction.
 */
INLINE void QtessSurface::
set_min_v(int min_v) {
  _min_v = min_v;
}


/**
 * Returns the number of patches the NURBS contains.  Each patch is a square
 * area bounded by isoparams.  This actually scales by the importance of the
 * surface, if it is not 1.
 */
INLINE double QtessSurface::
count_patches() const {
  return _num_u * _num_v * _importance2;
}

/**
 * Returns the number of triangles that will be generated by the current
 * tesselation parameters.
 */
INLINE int QtessSurface::
count_tris() const {
  return _tess_u * _tess_v * 2;
}

/**
 * Returns the extra dimension number within the surface where the vertex
 * membership in the indicated joint should be stored.
 */
INLINE int QtessSurface::
get_joint_membership_index(EggGroup *joint) {
  JointTable::iterator jti = _joint_table.find(joint);
  if (jti != _joint_table.end()) {
    return (*jti).second;
  }
  int d = _next_d;
  _next_d++;
  _joint_table[joint] = d;
  return d;
}

/**
 * Returns the extra dimension number within the surface where the indicated
 * Dxyz morph offset should be stored.
 */
INLINE int QtessSurface::
get_dxyz_index(const std::string &morph_name) {
  MorphTable::iterator mti = _dxyz_table.find(morph_name);
  if (mti != _dxyz_table.end()) {
    return (*mti).second;
  }
  int d = _next_d;
  _next_d += 3;
  _dxyz_table[morph_name] = d;
  return d;
}

/**
 * Returns the extra dimension number within the surface where the indicated
 * Drgba morph offset should be stored.
 */
INLINE int QtessSurface::
get_drgba_index(const std::string &morph_name) {
  MorphTable::iterator mti = _drgba_table.find(morph_name);
  if (mti != _drgba_table.end()) {
    return (*mti).second;
  }
  int d = _next_d;
  _next_d += 4;
  _drgba_table[morph_name] = d;
  return d;
}
